package persistencia.cliente;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import negocio.busqueda.Perfil;
import negocio.cv.ConocimientoIdioma;

import persistencia.DACBase;
import persistencia.DACNivel;
import persistencia.SingletonDACBase;

public class DACConocimientoIdiomas extends DACBase {
		
	private ConocimientoIdioma conocimientoIdioma;
	private List<ConocimientoIdioma> conocIdiomas;
	private CallableStatement clstm;
	private ResultSet rs;
	
	public DACConocimientoIdiomas(DACBase dacBase) {
		super(dacBase);
		// TODO Auto-generated constructor stub
	}

	public void actualizarConocimientoIdiomasPerfil( Perfil perfil) {
		try{	
			
			List<ConocimientoIdioma> ciAModificar = consultarConocimientosIdiomasPerfil(perfil.getIdPerfil());
			for (ConocimientoIdioma ci : perfil.getIdiomas()) {
								
				clstm = getConn().prepareCall("{? = call save_conocimientoidiomaperfil(?,?,?,?,?)}");
				
				clstm.registerOutParameter(1,java.sql.Types.INTEGER);
				
				clstm.setInt("idperfil", perfil.getIdPerfil());
				clstm.setInt("ididioma", ci.getIdioma().getIdIdoma());				
				clstm.setInt("idnivelescritura", ci.getNivelEscritura().getIdNivel());
				clstm.setInt("idnivellectura", ci.getNivelLectura().getIdNivel());
				clstm.setInt("idniveloral", ci.getNivelOral().getIdNivel());
				
				clstm.execute();
				
				if(ci.getIdConocimientoIdioma() == 0){
					ci.setIdConocimientoIdeoma(clstm.getInt(1));
				}
				
				
				int indice = ciAModificar.indexOf(ci);
				System.out.println(indice +"\n indice del cidioma que se esta actualizando "+ ci.getIdioma().getNombre()+" en el Amodificar");
				if(indice != -1){
					ciAModificar.remove(indice);
				}			
			}
			
			for (ConocimientoIdioma ci : ciAModificar) {
				eliminarConocimientoIdiomPerfil(ci);
			}
			  
			if(clstm != null)
				clstm.close();
	        clstm = null;
	         
	          	            
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo altaConocimientoIdiomasPerfil_ConocimientoIdiomas");
		}	
	}
	
	public void eliminarConocimientoIdiomPerfil(ConocimientoIdioma ci){
		try{			
			System.out.println("El conocimiento idioma" + ci.getIdConocimientoIdioma());
			clstm = getConn().prepareCall("{call delete_conocimientoidiomaperfil(?)}");			
			clstm.setInt("par_idconocidioma", ci.getIdConocimientoIdioma());
			clstm.execute();	
	         
	          	            
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo eliminarConocimientoIdiomasPerfil_ConocimientoIdiomas");
		}
	}
	
	public List<ConocimientoIdioma> consultarConocimientosIdiomasPerfil(int idPerfil) {
		try{
			conocIdiomas = new ArrayList<ConocimientoIdioma>();
			clstm = getConn().prepareCall("{call conocimientoIdionaPerfilConsultar(?)}");
			clstm.setInt("idperfil", idPerfil);			
			clstm.execute();
			rs = clstm.getResultSet();		
			
			while (rs.next()) {
				
				conocimientoIdioma = new ConocimientoIdioma();				
				
				conocimientoIdioma.setIdConocimientoIdeoma(rs.getInt("idconocimientoidioma"));
				
				DACIdioma dacIdioma = new DACIdioma(SingletonDACBase.tomarDACBase());
				conocimientoIdioma.setIdioma(dacIdioma.consultarIdioma(rs.getInt("ididioma")));
				
				DACNivel dacNivel = new DACNivel(SingletonDACBase.tomarDACBase());				
				conocimientoIdioma.setNivelEscritura(dacNivel.consultarNivel(rs.getInt("idnivelescritura")));				
				conocimientoIdioma.setNivelLectura(dacNivel.consultarNivel(rs.getInt("idnivellectura")));				
				conocimientoIdioma.setNivelOral(dacNivel.consultarNivel(rs.getInt("idniveloral")));
				
				conocIdiomas.add(conocimientoIdioma);			 
			}			           
	
			rs.close();
			rs = null;
			clstm.close();
	        clstm = null;
	        
	       
		}   
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarConocimientosIdiomasPerfil_DacConocimientoIdioma");
		}	
		return conocIdiomas;
	}
}
